package com.yueqian.sc.dao.impl;

import com.yueqian.sc.bean.Users;
import com.yueqian.sc.dao.IStudentDao;
import com.yueqian.sc.db.DBHelper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class StudentDao implements IStudentDao {
    /**
     * 添加学生
     *
     * @param user 要添加的学生信息
     * @return true:添加成功，false:添加失败
     */
    @Override
    public boolean addStudent(Users user) {
        Connection conn = null;
        PreparedStatement smt = null;
        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写sql语句
            String sql = "insert into users(username,password,nickname,gender,phone,specialty,grade,pic,role) \n" +
                    "value(?,?,?,?,?,?,?,?,2)";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态数据替换掉占位符?
            smt.setString(1, user.getUsername());
            smt.setString(2, user.getPassword());
            smt.setString(3, user.getNickname());
            smt.setString(4, user.getGender());
            smt.setString(5, user.getPhone());
            smt.setString(6,user.getSpecialty());
            smt.setString(7,user.getGrade());
            smt.setString(8, user.getPic());
            // 5. 执行sql,返回受影响的行数
            int row = smt.executeUpdate();// 增删改都用这个方法
            return row > 0 ? true : false;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 6. 关闭数据库连接
            DBHelper.close(smt, conn);
        }
        return false;
    }

    /**
     * 查询所有学生（支持模糊）
     *
     * @param keywords:搜索关键字，可以是nickname,也可以是gender,还可以是rank
     * @return
     */
    @Override
    public List<Users> findStudentAll(String keywords) {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet rs = null;
        List<Users> list = null;
        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写sql语句
            String sql = "select * from users where role = 2 and del_flag = 0 and (nickname like ? or gender like ? or specialty like ? or grade like ?)  limit 0,5";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态数据替换掉占位符？
            // 非空处理，免得报异常
            if (keywords == null) {
                keywords = "";
            }
            smt.setString(1, "%" + keywords + "%");// nickname
            smt.setString(2, "%" + keywords + "%");// gender
            smt.setString(3, "%" + keywords + "%");// specialty
            smt.setString(4, "%" + keywords + "%");// grade
            // 5. 执行sql，返回查询回来的结果集
            rs = smt.executeQuery();// 这个方法只针对查询
            // 6. 解析结果集
            if (rs != null) {
                list = new ArrayList<>();// 这句代码很关键，这句代码很关键，这句代码很关键
                // 遍历结果集
                while (rs.next()) {
                    // 一条数据
                    Users users = new Users();
                    // 从结果集取出数据放入实体类,绿色部分就是数据库表中对应的字段名
                    users.setUserId(rs.getInt("user_id"));
                    users.setUsername(rs.getString("username"));
                    users.setPassword(rs.getString("password"));
                    users.setNickname(rs.getString("nickname"));
                    users.setGender(rs.getString("gender"));
                    users.setPhone(rs.getString("phone"));
                    users.setSpecialty(rs.getString("specialty"));
                    users.setGrade(rs.getString("grade"));
                    users.setPic(rs.getString("pic"));
                    users.setRole(rs.getInt("role"));
                    users.setDelFalg(rs.getInt("del_flag"));
                    list.add(users);// 将每一条数据都添加到集合中
                }

            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 7. 关闭数据库
            DBHelper.close(rs, smt, conn);
        }
        return list;
    }

    /**
     * 查询满足条件的学生的总条目数
     *
     * @param keywords
     * @return
     */
    @Override
    public int studentCount(String keywords) {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet rs = null;
        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写sql语句
            String sql = "select count(*) from users where role = 2 and del_flag = 0 \n" +
                    "  and (nickname like ? or gender like ? or specialty like ? or grade like ?)";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态数据替换掉占位符？
            // 非空处理，免得报异常
            if (keywords == null) {
                keywords = "";
            }
            smt.setString(1, "%" + keywords + "%");// nickname
            smt.setString(2, "%" + keywords + "%");// gender
            smt.setString(3, "%" + keywords + "%");// specialty
            smt.setString(4, "%" + keywords + "%");// grade
            // 5. 执行sql，返回查询回来的结果集
            rs = smt.executeQuery();// 这个方法只针对查询
            // 6. 解析结果集
            if (rs != null && rs.next()) {
                return rs.getInt(1);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 7. 关闭数据库
            DBHelper.close(rs, smt, conn);
        }
        return 0;
    }

    /**
     * 查询所有学生（支持模糊，支持分页）
     *
     * @param keywords   ：关键字
     * @param startIndex ：开始的索引位置，默认从0开始
     * @param pageSize   ：每页要显示的条目数
     * @return
     */
    @Override
    public List<Users> findStudentAll(String keywords, int startIndex, int pageSize) {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet rs = null;
        List<Users> list = null;
        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写sql语句
            String sql = "select * from users where role = 2 and del_flag = 0 and (nickname like ? or gender like ? or specialty like ? or grade like ?)  limit ?,?";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态数据替换掉占位符？
            // 非空处理，免得报异常
            if (keywords == null) {
                keywords = "";
            }
            smt.setString(1, "%" + keywords + "%");// nickname
            smt.setString(2, "%" + keywords + "%");// gender
            smt.setString(3, "%" + keywords + "%");// specialty
            smt.setString(4, "%" + keywords + "%");// grade
            smt.setInt(5,startIndex);// startIndex
            smt.setInt(6,pageSize);// pageSize
            // 5. 执行sql，返回查询回来的结果集
            rs = smt.executeQuery();// 这个方法只针对查询
            // 6. 解析结果集
            if (rs != null) {
                list = new ArrayList<>();// 这句代码很关键，这句代码很关键，这句代码很关键
                // 遍历结果集
                while (rs.next()) {
                    // 一条数据
                    Users users = new Users();
                    // 从结果集取出数据放入实体类,绿色部分就是数据库表中对应的字段名
                    users.setUserId(rs.getInt("user_id"));
                    users.setUsername(rs.getString("username"));
                    users.setPassword(rs.getString("password"));
                    users.setNickname(rs.getString("nickname"));
                    users.setGender(rs.getString("gender"));
                    users.setPhone(rs.getString("phone"));
                    users.setSpecialty(rs.getString("specialty"));
                    users.setGrade(rs.getString("grade"));
                    users.setPic(rs.getString("pic"));
                    users.setRole(rs.getInt("role"));
                    users.setDelFalg(rs.getInt("del_flag"));
                    list.add(users);// 将每一条数据都添加到集合中
                }

            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 7. 关闭数据库
            DBHelper.close(rs, smt, conn);
        }
        return list;
    }

    /**
     * 根据user_id修改学生信息
     *
     * @param user
     * @return
     */
    @Override
    public boolean updateStudent(Users user) {
        Connection conn = null;
        PreparedStatement smt = null;

        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写修改的sql
            String sql = "update users set nickname=?,gender=?,phone=?,specialty=?,grade=?,pic=? where user_id =?";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态的数据替换掉问号
            smt.setString(1, user.getNickname());
            smt.setString(2, user.getGender());
            smt.setString(3, user.getPhone());
            smt.setString(4, user.getSpecialty());
            smt.setString(5,user.getGrade());
            smt.setString(6, user.getPic());
            smt.setInt(7, user.getUserId());
            // 5. 执行sql,返回受影响的行数
            int row = smt.executeUpdate();
            return row > 0 ? true : false;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 6. 关闭数据库连接
            DBHelper.close(smt, conn);
        }
        return false;
    }

    /**
     * 根据user_id查询学生信息
     *
     * @param userId
     * @return
     */
    @Override
    public Users findStudentById(int userId) {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet rs = null;
        Users users = null;
        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写sql语句
            String sql = "select * from users where user_id = ? and del_flag = 0";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态数据替换掉占位符
            smt.setInt(1, userId);
            // 5. 执行sql，返回查询回来的结果集
            rs = smt.executeQuery();// 这个方法只针对查询
            // 6. 解析结果集
            if (rs != null && rs.next()) {
                // 一条数据
                users = new Users();
                // 从结果集取出数据放入实体类,绿色部分就是数据库表中对应的字段名
                users.setUserId(rs.getInt("user_id"));
                users.setUsername(rs.getString("username"));
                users.setPassword(rs.getString("password"));
                users.setNickname(rs.getString("nickname"));
                users.setGender(rs.getString("gender"));
                users.setPhone(rs.getString("phone"));
                users.setSpecialty(rs.getString("specialty"));
                users.setGrade(rs.getString("grade"));
                users.setPic(rs.getString("pic"));
                users.setRole(rs.getInt("role"));
                users.setDelFalg(rs.getInt("del_flag"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 7. 关闭数据库
            DBHelper.close(rs, smt, conn);
        }
        return users;
    }

    /**
     * 根据user_id删除学生（真删除）
     *
     * @param userId
     * @return
     */
    @Override
    public boolean deleteStudent(int userId) {
        Connection conn = null;
        PreparedStatement smt = null;
        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写修改的sql
            String sql = "delete from users where user_id = ?";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态的数据替换掉问号
            smt.setInt(1,userId);
            // 5. 执行sql,返回受影响的行数
            int row = smt.executeUpdate();
            return row > 0 ? true : false;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 6. 关闭数据库连接
            DBHelper.close(smt, conn);
        }
        return false;
    }

    /**
     * 根据user_id删除学生（假删除）
     *
     * @param userId
     * @return
     */
    @Override
    public boolean deleteStudent2(int userId) {
        Connection conn = null;
        PreparedStatement smt = null;

        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写修改的sql
            String sql = "update users set del_flag = 1 where user_id = ?";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态的数据替换掉问号
            smt.setInt(1,userId);
            // 5. 执行sql,返回受影响的行数
            int row = smt.executeUpdate();
            return row > 0 ? true : false;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 6. 关闭数据库连接
            DBHelper.close(smt, conn);
        }
        return false;
    }
}
